package com.zhz.common.tool.mybatisplus.base.dal.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;

import java.time.LocalDateTime;

/**
 * 审计字段处理类
 * 这个类的职责是处理默认审计字段的填充和修改
 *
 * @author zhouhengzhe
 */
public class BaseMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入时自动填充的逻辑方法
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now);
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now);
        this.strictInsertFill(metaObject, "creator", String.class, "Admin");
        this.strictInsertFill(metaObject, "creatorCode", String.class, "Admin");
        this.strictInsertFill(metaObject, "updater", String.class, "Admin");
        this.strictInsertFill(metaObject, "updaterCode", String.class, "Admin");
    }

    /**
     * 更新时自动填充的逻辑方法
     * 这种方式，可以解决系统，直接select出来的 entity 然后直接更新的情况，
     * 导致 更新人，和更新时间没有发生变化
     * <p>
     * 但是 对于异步里面的情况 会设置会 admin的
     * 如：
     * 定时任务
     * 发布的 Listener
     * <p>
     * 这种情况 讨论之后 属于正常 情况。
     * 因为这个 数据确实 不是用户修改这个记录的某个字段，
     * 而是系统中触发的，所以设置为 admin 也是合理
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updater", String.class, "Admin");
        this.strictInsertFill(metaObject, "updaterCode", String.class, "Admin");
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }

}